S3に保存されたJSONのスキーマが変わった場合、Athenaクエリに調整が必要か試してみた
はじめに
AthenaでS3に保存されたJSONに対してクエリを行っていました。 この時S3に保存されたJSONのスキーマが変わった場合、Athenaクエリの書き換え、またはテーブルの編集が必要なのか気になったので確認してみました。
通常のクエリ
まずは、以下のデータをS3に保存します。
{ "deviceid": "abc123", "location": "osaka", "temperature": 26.3, "humidity": 60.1, "pressure": 23.2 }
次に、Athenaでテーブルを作成してクエリを実行します。 <テーブル作成クエリ>
CREATE EXTERNAL TABLE demo_db.my_table ( deviceid STRING, location STRING, temperature DOUBLE, humidity DOUBLE, pressure DOUBLE ) LOCATION 's3://<my-bucket-name>/' TBLPROPERTIES ('has_encrypted_data'='false');
<クエリ>
SELECT * FROM "demo_db"."my_table";
<結果>
JSONデータの内容が表示されることが確認できました。
データを1つ削除する
次に、先ほどのデータから最後のデータを削除したデータをS3に登録してみます。
{ "deviceid": "abc123", "location": "osaka", "temperature": 26.3, "humidity": 60.1 }
"pressure"という項目を削除しました。 イメージとしては
- 削除した項目のみ空欄となる
- エラーが出る
のどちらかだと思います。 それはテーブルは編集せずに先ほどと同じようにクエリを実行してみます。
削除した項目のみ空欄となる。でした。
データを1つ増やす
では次に、データを増やしてみましょう。 以下のデータをS3に保存します。
{ "deviceid": "abc123", "location": "osaka", "temperature": 26.3, "humidity": 60.1 "pressure": 23.2 "power": 105.1 }
イメージとしては
- 追加した項目は表示されない
- エラーが出る
のどちらかだと思います。 それはテーブルはいじらずに先ほどと同じようにクエリを実行してみます。
追加した項目は表示されない。でした。 それでは追加した項目を表示するために、テーブルを更新するとどうなるかも試してみましょう。
まずは以下のクエリでテーブルにpowerのカラムを追加します。
ALTER TABLE demo_db.my_table ADD COLUMNS (power DOUBLE);
<結果>
powerを追加したデータのみpowerの値が表示されていますね。
ちなみにカラムが不要になった場合でも、
カラムを削除するとスキーマが壊れるため、削除されたカラムがない状態のテーブルの再作成が必要になるようです。
そのため、カラムの削除は推奨されていないようです。
まとめ
スキーマが変わった場合はクエリ内容を変更することで柔軟にデータを表示することができました。
また、項目を追加した場合はテーブル更新+クエリ編集でデータを表示することが確認できました。